package com.sean.springframework.beans.factory.support;

import com.sean.springframework.beans.BeansException;
import com.sean.springframework.beans.factory.config.BeanDefinition;

import java.util.HashMap;
import java.util.Map;

/**
 * 核心类实现
 * 1. DefaultListableBeanFactory 在 Spring 源码中也是一个非常核心的类
 * 2. DefaultListableBeanFactory 继承了 AbstractAutowireCapableBeanFactory 类，
 *    也就具备了接口 BeanFactory 和 AbstractBeanFactory 等一连串的功能实现。
 * 3. 除此之外这个类还实现了接口 BeanDefinitionRegistry 中的
 *    registerBeanDefinition(String beanName, BeanDefinition beanDefinition) 方法.
 *    还会看到一个 getBeanDefinition 的实现，这个方法我们文中提到过它是抽象类 AbstractBeanFactory 中定义的抽象方法。
 *
 */
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry  {

    private final Map<String, BeanDefinition> beadDefinitionMap = new HashMap<>();

    // 注册 Bean
    @Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
        this.beadDefinitionMap.put(beanName, beanDefinition);
    }

    // 获取 Bean
    @Override
    protected BeanDefinition getBeanDefinition(String beanName) throws BeansException {
        BeanDefinition beanDefinition = beadDefinitionMap.get(beanName);
        if(beanDefinition == null) throw new BeansException("No bean name '" + beanName + "' is defined");
        return beanDefinition;
    }
}
